All files / util async_observer.ts

94.12% Statements 16/17
50% Branches 2/4
85.71% Functions 6/7
93.33% Lines 14/15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                                                2x         251x   251x   2x 346x     2x       2x 246x     346x 346x 346x 346x 346x         2x  
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { Observer } from '../core/event_manager';
import { EventHandler } from './misc';
 
/*
 * A wrapper implementation of Observer<T> that will dispatch events
 * asynchronously. To allow immediate silencing, a mute call is added which
 * causes events scheduled to no longer be raised.
 */
export class AsyncObserver<T> implements Observer<T> {
  /**
   * When set to true, will not raise future events. Necessary to deal with
   * async detachment of listener.
   */
  private muted = false;
 
  constructor(private observer: Observer<T>) {}
 
  next(value: T): void {
    this.scheduleEvent(this.observer.next, value);
  }
 
  error(error: Error): void {
    this.scheduleEvent(this.observer.error, error);
  }
 
  mute(): void {
    this.muted = true;
  }
 
  private scheduleEvent<E>(eventHandler: EventHandler<E>, event: E): void {
    Eif (!this.muted) {
      setTimeout(() => {
        Eif (!this.muted) {
          eventHandler(event);
        }
      }, 0);
    }
  }
}